package com.developer.persistence.modulo.indicadores;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;

import com.developer.core.utils.SimpleLogger;
import com.developer.logic.modulo.general.dto.VOHistoricoIndicador;
import com.developer.mybatis.DBManager;
import com.developer.persistence.modulo.indicadores.mapper.dao.HistoricoIndicadorMapper;
import com.developer.persistence.modulo.indicadores.mapper.dao.IndicadorMapper;
import com.developer.persistence.modulo.indicadores.mapper.dao.ListasIndicadorMapper;
import com.developer.persistence.modulo.indicadores.mapper.dto.HistoricoIndicador;
import com.developer.persistence.modulo.indicadores.mapper.dto.Indicador;
import com.developer.persistence.modulo.indicadores.mapper.dto.IndicadorKey;
import com.developer.persistence.modulo.indicadores.mapper.dto.ListaIndicador;
import com.developer.web.general.Constantes;

public class ControllerIndicadores {

	private static ControllerIndicadores instance = null;

	public static ControllerIndicadores getInstance() {

		if (instance == null) {
			return new ControllerIndicadores();
		}
		return instance;
	}

	public Integer contarIndicadores(Indicador indicador) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			IndicadorMapper indicadorMapper = session
					.getMapper(IndicadorMapper.class);
			if (indicador != null) {
				indicador = (Indicador) indicador.clone();
			}
			if (indicador != null
					&& StringUtils.isNotEmpty(indicador
							.getInd_descripcion_corta())) {
				indicador.setInd_descripcion_corta("%"
						+ indicador.getInd_descripcion_corta() + "%");
			}

			return indicadorMapper.contarIndicadores(indicador);

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;

	}

	/**
	 * 
	 * @param indicador
	 * @param rowBounds
	 *            primer registro, cantidad
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Indicador> buscarIndicadores(Indicador indicador,
			RowBounds rowBounds) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			// IndicadorMapper indicadorMapper =
			// session.getMapper(IndicadorMapper.class);
			if (indicador != null) {
				indicador = (Indicador) indicador.clone();
			}
			if (indicador != null
					&& StringUtils.isNotEmpty(indicador
							.getInd_descripcion_corta())) {
				indicador.setInd_descripcion_corta("%"
						+ indicador.getInd_descripcion_corta() + "%");
			}
			return session.selectList(IndicadorMapper.class.getCanonicalName()
					+ ".buscarIndicadores", indicador, rowBounds);

			// return indicadorMapper.buscarIndicadores(indicador, rowBounds);

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return null;

	}

	public Boolean guardarIndicador(Indicador indicador) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			IndicadorMapper indicadorMapper = session
					.getMapper(IndicadorMapper.class);

			Indicador selectByPrimaryKey = indicadorMapper
					.selectByPrimaryKey(indicador);
			Integer guardados = 0;
			if (selectByPrimaryKey == null) {
				indicador.setInd_activo(true);
				indicador.setEmp_codigo(Constantes.EMP_CODIGO);
				indicador.setInd_fecha_ingreso(new Date());
				indicador.setInd_responsable("server");// TODO cambiar por
														// responsable
				indicador.setInd_creado_por("server");// TODO cambiar por
														// creador
				guardados = indicadorMapper.insertSelective(indicador);
			} else {
				indicador.setInd_fecha_actualizacion(new Date());
				guardados = indicadorMapper
						.updateByPrimaryKeySelective(indicador);
			}

			return guardados > 0;

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return false;

	}

	public Boolean actualizarIndicador(Indicador indicador) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			IndicadorMapper indicadorMapper = session
					.getMapper(IndicadorMapper.class);

			Integer guardados = indicadorMapper.updateByPrimaryKey(indicador);

			return guardados > 0;

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return false;

	}

	public Indicador obtenerIndicador(IndicadorKey indicadorKey) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			IndicadorMapper indicadorMapper = session
					.getMapper(IndicadorMapper.class);

			Indicador indicador = new Indicador(indicadorKey);
			indicador.setInd_activo(false);

			return indicadorMapper.selectByPrimaryKey(indicadorKey);

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return null;

	}

	public Boolean borrarIndicador(IndicadorKey indicadorKey) {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			IndicadorMapper indicadorMapper = session
					.getMapper(IndicadorMapper.class);

			Indicador indicador = new Indicador(indicadorKey);
			indicador.setInd_activo(false);

			Integer guardados = indicadorMapper
					.updateByPrimaryKeySelective(indicador);

			return guardados > 0;

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return false;

	}

	public List<ListaIndicador> obtenerAreasClaveResultados() {

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			ListasIndicadorMapper listasIndicadorMapper = session
					.getMapper(ListasIndicadorMapper.class);
			return listasIndicadorMapper.obtenerAreasClaveResultados();

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;

	}

	public List<ListaIndicador> obtenerTiposIndicador() {
		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			ListasIndicadorMapper listasIndicadorMapper = session
					.getMapper(ListasIndicadorMapper.class);
			return listasIndicadorMapper.obtenerTiposIndicador();

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;

	}

	public List<ListaIndicador> obtenerUnidadesMedida() {
		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			ListasIndicadorMapper listasIndicadorMapper = session
					.getMapper(ListasIndicadorMapper.class);
			return listasIndicadorMapper.obtenerUnidadesMedida();

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;

	}

	public List<ListaIndicador> obtenerPeriodos() {
		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			ListasIndicadorMapper listasIndicadorMapper = session
					.getMapper(ListasIndicadorMapper.class);
			return listasIndicadorMapper.obtenerPeriodos();

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;

	}

	public List<ListaIndicador> obtenerFormulas() {
		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			ListasIndicadorMapper listasIndicadorMapper = session
					.getMapper(ListasIndicadorMapper.class);
			return listasIndicadorMapper.obtenerFormulas();

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}
		return null;
	}

	public List<ListaIndicador> obtenerListaAcumula() {
		List<ListaIndicador> lista = new ArrayList<ListaIndicador>();
		lista.add(new ListaIndicador("U", "Último valor"));
		lista.add(new ListaIndicador("P", "Promedio"));
		lista.add(new ListaIndicador("A", "Acumulado"));
		return lista;
	}
	//comentario
	
	public List<HistoricoIndicador> obtenerHistorialIndicador(HistoricoIndicador example){

		SqlSession session = DBManager.openSessionAutoCommit();
		try {
			HistoricoIndicadorMapper historicoIndicadorMapper = session.getMapper(HistoricoIndicadorMapper.class);

			 return historicoIndicadorMapper.obtenerHistoricoIndicador(example);

		} catch (Exception e) {
			SimpleLogger.error(e.getMessage(), e);
		} finally {
			session.close();

		}

		return null;

	}

}
